package com.hspedu.super_;

/**
 * @Author Stringzhua
 * @Date 2024/3/2 11:29
 * description:
 */
public class B extends A {
//    public int n1 = 888;

    //编写测试方法
    public void test() {
        /*super的访问不限于直接父类,
        如果爷爷类和本类中有同名的成员,也可以使用super去访问爷爷类的成员；
        如果多个基类(上级类)中都有同名的成员,使用super访问遵循就近原则
        A->B->C*/
        System.out.println("super.n1 = " + super.n1);
        super.cal();//调用Base类的cal()方法

//      当然也需要遵顼访问权限的相关规则  'cal()' has private access in 'com.hspedu.super_.Base'
    }

    //访问父类的属性,但不会访问父类的private属性
    //例如 super.属性名
    public void hi() {
        System.out.println(super.n1 + " " + super.n2 + " " + super.n3);
//        System.out.println(super.n4);
    }

    public void cal() {
        System.out.println("B类的cal()方法...");
    }

    public void sum() {
        System.out.println("B类的sum()方法被调用...");
        //演示子类访问父类方法的规则
        //希望调用父类的cal方法
        //这是因为子类B没有cal()方法,可以使用下面三种方式
//        cal();//B类的cal()方法...
        //找cal方法时(cal()和tihs.cal())的顺序是
        // 1.先找本类,如果有,并且可以调用,则调用。
        // 2.如果没有,找父类(如果有并可以调用,则调用。)
        // 3.如果父类没有,则继续找父类的父类。直到Object类
        // 提示:如果在父类查找方法的过程中找到了,但是不能访问,则报错 'cal()' has private access in 'com.hspedu.super_.A'
        // 如果在父类查找方法的过程中,如果没有找到,则提示该方法不存在 Cannot resolve method 'cal' in 'B'

//        this.cal();//等价于 cal //B类的cal()方法...

//        super.cal();//找cal方法的顺序是直接查找父类,其他的规则一样 //B类的cal()方法...
//演示子类访问父类属性的规则
        //n1和this.n1查找的规则是
        //1.先查找本类,如果有,则调用
        //2.如果本类没有该属性,则查找父类(如果有,并且可以调用,则调用)
        //3.如果父类没有,则继续找父类的父类。直到Object类
        // 提示:如果在父类查找方法的过程中找到了,但是不能访问,则报错 'n1' has private access in 'com.hspedu.super_.A'
        // 如果在父类查找方法的过程中,如果没有找到,则提示该方法不存在 Cannot resolve symbol 'n1'
//        System.out.println(n1);//888
//        System.out.println(this.n1);//888

        //找n1 (super.n1) 的顺序是先查找父类,其他的规则一样
//        System.out.println(super.n1);//100
    }

    //访问父类的方法,不能访问父类的private方法 super.方法名(参数列表)
    public void ok() {
        super.test100();
        super.test200();
        super.test300();
//        super.test400();
    }

    //访问父类的构造器(之前讲过) super(形参列表); 只能放在构造器的第一句,只能出现一句；
//    public void hello(){
//        super();//此处不能使用super
//    }
    public B() {
//        super();  //默认的无参构造器
//        super("jack",30);//两个参数的有参构造器
        super("jack");//一个参数的有参构造器
    }
}
